package com.wu.flandre.configuration;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.ThreadPoolExecutor;

/**
 * 自定义线程类
 *
 * @author 50816
 * @date 2019年12月1日 19:09:02
 */
@Configuration
public class ThreadPoolConfig {

    @Bean("getThreadPoolExecutor")
    public ThreadPoolTaskExecutor getThreadPoolExecutor() {
        ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
        //线程池创建时候初始化的线程数
        threadPoolTaskExecutor.setCorePoolSize(10);
        // 线程池最大的线程数，只有在缓冲队列满了之后才会申请超过核心线程数的线程
        threadPoolTaskExecutor.setMaxPoolSize(15);
        //用来缓冲执行任务的队列
        threadPoolTaskExecutor.setQueueCapacity(20);
        //当超过了核心线程出之外的线程在空闲时间到达之后会被销毁
        threadPoolTaskExecutor.setKeepAliveSeconds(60);
        //线程池名的前缀：设置好了之后可以方便我们定位处理任务所在的线程池
        threadPoolTaskExecutor.setThreadNamePrefix("ThreadPool-");
        //线程池对拒绝任务的处理策略
        threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        //关闭线程池的时候，是否等待当前任务执行完成。
        threadPoolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);
        //等待当前任务完成的超时时间60秒，如果一直等待就会造成阻塞。
        threadPoolTaskExecutor.setAwaitTerminationSeconds(60);
        threadPoolTaskExecutor.initialize();
        return threadPoolTaskExecutor;
    }
}
